#include "Sock.hpp"

#include <cassert>
#include <signal.h>
#include <functional>


using func_t = std::function<void(int)>;

class HttpServer
{
public:
    HttpServer(uint16_t port, func_t func)
        : _listenSock(-1)
        , _func(func)
    {
        // 创建套接字
        _listenSock = _sock.Socket();
        assert(_listenSock != -1);
        // 绑定IP + port
        _sock.Bind(_listenSock, port);
        // 设置listen状态
        _sock.Listen(_listenSock);
    }

    // 启动服务器
    void Start()
    {
        signal(SIGCHLD, SIG_IGN);
        while(1)
        {
            //  获取客户端IP + port
            std::string clientIp;
            uint16_t clientPort;
            // 接收数据
            int serverSock = _sock.Accept(_listenSock, clientIp, clientPort);
            if(serverSock < 0)
            {
                std::cout << "accept fail" << std::endl;
                continue;
            }

            if(fork() == 0)
            {// 子进程
                // 关闭不需要的文件描述符
                close(_listenSock);
                _func(serverSock);
                close(serverSock);
                exit(0);
            }

            // 关闭不需要的文件描述符
            close(serverSock);
        }
    }

    ~HttpServer()
    {
        if(_listenSock >= 0) close(_listenSock);
    }

private:
    int _listenSock;
    Sock _sock;
    func_t _func;
};

// class HttpServer
// {
// public:
//     using func_t = std::function<void(int)>;
// private:
//     int listensock_;
//     uint16_t port_;
//     Sock sock;
//     func_t func_;
// public:
//     HttpServer(const uint16_t &port, func_t func): port_(port),func_(func)
//     {
//         listensock_ = sock.Socket();
//         sock.Bind(listensock_, port_);
//         sock.Listen(listensock_);
//     }
//     void Start()
//     {
//         signal(SIGCHLD, SIG_IGN);
//         for( ; ; )
//         {
//             std::string clientIp;
//             uint16_t clientPort = 0;
//             int serverSock = sock.Accept(listensock_, clientIp, clientPort);
//             if(serverSock < 0) continue;
//             if(fork() == 0)
//             {
//                 close(listensock_);
//                 func_(serverSock);
//                 close(serverSock);
//                 exit(0);
//             }
//             close(serverSock);
//         }
//     }
//     ~HttpServer()
//     {
//         if(listensock_ >= 0) close(listensock_);
//     }
// };
